home *** CD-ROM | disk | FTP | other *** search
- #include <signal.h>
- #include <stdio.h>
- #include <errno.h>
- #include "../conf/options.h"
-
-
- #define EXECCHECK if (getuid() != 0) {fprintf(stderr,"root only\n");exit(1);}
- #define RUNNINGCHECK if (!running) {fprintf(stderr,"named not running\n"); continue;}
- #ifdef ROOTONLY
- #define ROOTCHECK EXECCHECK
- #else
- #define ROOTCHECK
- #endif
-
- extern char **environ;
-
- char *newenv[] =
- {
- "PATH=/bin",
- "HOME=/",
- 0
- };
-
- main(argc,argv)
- int argc;
- char **argv;
- {
- FILE* f;
- unsigned long i = 0;
- unsigned long s;
- int running = 0;
-
- f = fopen(_PATH_PIDFILE,"r");
-
- if (f) {
- if (fscanf(f,"%u",&i) == 1) {
- if (kill(i,0) == -1) {
- switch(errno) {
- case EPERM:
- running = 1;
- break;
- }
- } else {
- running = 1;
- }
- }
- fclose(f);
- }
-
- s = SIGHUP;
- while ( argc-- > 1 ) {
-
- argv++;
- if ( ! strcmp(argv[0],"status")) {
- fprintf(stderr,"reload: named is%srunning\n",
- running? " ":" not ");
- continue;
- } else if ( ! strcmp(argv[0],"dumpdb") ) {
- ROOTCHECK
- RUNNINGCHECK
- fprintf(stderr,"reload: dumping database\n");
- s = SIGINT;
- } else if ( ! strcmp(argv[0],"reload") ) {
- RUNNINGCHECK
- fprintf(stderr,"reload: reloading database\n");
- s = SIGHUP;
- } else if ( ! strcmp(argv[0],"stats") ) {
- ROOTCHECK
- RUNNINGCHECK
- fprintf(stderr,"reload: dumping stats\n");
- s = SIGIOT;
- } else if ( ! strcmp(argv[0],"trace") ) {
- ROOTCHECK
- RUNNINGCHECK
- fprintf(stderr,"reload: tracing on\n");
- #if defined(SIGUSR1) && defined(SIGUSR2)
- s = SIGUSR1;
- #else
- s = SIGEMT;
- #endif
- } else if ( ! strcmp(argv[0],"notrace") ) {
- ROOTCHECK
- RUNNINGCHECK
- fprintf(stderr,"reload: turning tracing off\n");
- #if defined(SIGUSR1) && defined(SIGUSR2)
- s = SIGUSR2;
- #else
- s = SIGFPE;
- #endif
- #if defined(SIGWINCH) && defined(QRYLOG)
- } else if ( ! strcmp(argv[0],"querylog") ) {
- ROOTCHECK
- RUNNINGCHECK
- fprintf(stderr,"reload: querylog toggled\n");
- s = SIGWINCH;
- #endif
- } else if ( ! strcmp(argv[0],"stop") ) {
- EXECCHECK
- fprintf(stderr,"reload: stopping named\n");
- s = SIGTERM;
- } else if ( ! strcmp(argv[0],"restart") ) {
- EXECCHECK
- if (running) {
- s = SIGTERM;
- if (kill(i,s)) {
- perror("reload: kill");
- fprintf(stderr,"reload: named NOT restarted\n");
- exit(1);
- }
- }
- setuid(geteuid());
- environ = newenv;
- argv[0] = "named";
- execv(NAMED, argv);
- perror("execv");
- exit(1);
- } else if ( ! strcmp(argv[0],"start") ) {
- EXECCHECK
- if (running) {
- fprintf(stderr,"named already running\n");
- continue;
- }
- setuid(geteuid());
- environ = newenv;
- argv[0] = "named";
- execv(NAMED, argv);
- perror("execv");
- exit(1);
- } else {
- fprintf(stderr,"unknown switch \"%s\"\n",argv[0]);
- fprintf(stderr, "Usage: reload %s ...\n",
- #if defined(SIGWINCH) && defined(QRYLOG)
-
- "(status|dumpdb|reload|stats|trace|notrace|querylog|start|stop|restart)"
- #else
- "(status|dumpdb|reload|stats|trace|notrace|start|stop|restart)"
- #endif
- );
- continue;
- }
- if (kill(i,s)) {
- perror("reload: kill");
- }
- }
- exit(0);
- }
-
-